package com.sky.context;

import java.util.HashMap;
import java.util.Map;

public class BaseContext {

    private BaseContext(){}

    /**
     * 由于单纯的value会发生值覆盖，所以我们使用Map<String, Object>作为value
     */
    private static final ThreadLocal<Map<String, Object>> THREAD_CONTEXT = new ThreadLocal<>();

    /**
     * 键值对存入线程变量中
     * @param key
     * @param value
     */
    public static void put(String key, Object value) {
        // 先查找出其线程变量内部维护的Map
        Map<String, Object> map = THREAD_CONTEXT.get();
        // 第一次从ThreadLocalMap中根据threadLocal取出的value可能是null
        if (map == null) {
            // 第一次存入时new一个新的Map
            map = new HashMap<>();
            // 把map作为value放进去
            THREAD_CONTEXT.set(map);
        }
        // 把要存入线程变量的键值对存入map中
        map.put(key, value);
    }

    /**
     * 从线程变量中取出该key对应的value
     * @param key
     * @return
     */
    public static Object get(String key) {
        // 先获取Map
        Map<String, Object> map = THREAD_CONTEXT.get();
        // 从Map中得到value
        return map != null ? map.get(key) : null;
    }

    /**
     * 移除当前线程变量中指定key对应的的value
     * @param key
     */
    public static void remove(String key) {
        Map<String, Object> map = THREAD_CONTEXT.get();
        map.remove(key);
    }

    /**
     * 清空线程变量中的所有变量
     */
    public static void clear() {
        THREAD_CONTEXT.remove();
    }

}
